{"id":37019,"date":"2019-10-31T22:15:20","date_gmt":"2019-10-31T19:15:20","guid":{"rendered":"https:\/\/prohoster.info\/blog\/sistema-udalennogo-fajlovogo-dostupa-cage\/"},"modified":"2019-10-31T22:15:20","modified_gmt":"2019-10-31T19:15:20","slug":"sistema-udalennogo-fajlovogo-dostupa-cage","status":"publish","type":"post","link":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/sistema-udalennogo-fajlovogo-dostupa-cage","title":{"rendered":"Cage Remote File Access System","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h3>System Purpose<\/h3>\n<p><\/p>\n<p>Support for remote access to files on computers within the network. The system 'virtually' supports all major file operations (creation, deletion, reading, writing, etc.) through the exchange of transactions (messages) via the TCP protocol.<\/p>\n<p><\/p>\n<h3>Application Areas<\/h3>\n<p><\/p>\n<p>The system's functionality is effective in the following cases:<\/p>\n<ul>\n<li> in native applications for mobile and embedded devices (smartphones, onboard control systems, etc.) that require quick access to files on remote servers in conditions with likely intermittent connectivity (going offline);<\/li>\n<li> in heavily loaded databases if request processing occurs on one server while data storage is on another;<\/li>\n<li> in distributed corporate networks for data collection and processing that require high-speed data exchange, redundancy, and reliability;<\/li>\n<li> in complex systems with microservice architecture where delays in information exchange between modules are critically important.<\/li>\n<\/ul>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex> <\/p>\n<h3>Structure<\/h3>\n<p><\/p>\n<p>The Cage system (a beta version implemented in Python 3.7 for Windows) consists of two main parts: <\/p>\n<ol>\n<li> <b>Cageserver<\/b> \u2014 a file server program (function package) that runs on computers within the network, to which remote access to files is needed;<\/li>\n<li> class <b>Cage<\/b> with a library of methods for client software that simplifies interaction with servers.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Using the system on the client side<\/h3>\n<p><\/p>\n<p>The methods of the Cage class replace standard, 'routine' file system operations: <i>creating, opening, closing, deleting <\/i>files, as well as <i>reading\/writing data in binary format<\/i> (specifying the position and size of data). Conceptually, these methods are close to file functions in the C language, where opening\/closing files is done 'over input-output channels.' <\/p>\n<p><\/p>\n<p>In other words, the programmer works not with methods of 'file' objects (class <b>_io<\/b> in Python), but with methods of the Cage class.<\/p>\n<p><\/p>\n<p>When creating an instance of the Cage object, it establishes an initial connection with the server (or multiple servers), undergoes authorization by client Id, and receives confirmation with the assigned port number for all file operations. When the Cage object is deleted, it issues a command to the server to terminate the connection and close the files. The servers can also initiate disconnection.<\/p>\n<p><\/p>\n<p>The system enhances read\/write performance by buffering frequently accessed file fragments in the cache (RAM buffer) of client programs.<br \/>\nClient software can utilize any number of Cage objects with various configurations (buffer size, block size for server communication, etc.). <\/p>\n<p><\/p>\n<p>A single Cage object can exchange data with multiple files across several servers. Connection parameters (IP address or DNS of the server, primary authorization port, path, and file name) are specified when creating the object.<\/p>\n<p><\/p>\n<p>Since each Cage object can simultaneously work with many files, a shared memory space is used for buffering. The cache size \u2014 the number of pages and their size \u2014 is set dynamically when creating the Cage object. For example, a 1 GB cache can consist of 1000 pages of 1 MB each, or 10,000 pages of 100 KB, or 1 million pages of 1 KB. The choice of size and number of pages is a specific task for each application case.<\/p>\n<p><\/p>\n<p>Multiple Cage objects can be used simultaneously to establish different buffer memory settings according to the access patterns of various files. A simple buffering algorithm is applied as the basis: once the set memory volume is exhausted, new pages replace old ones based on a principle of evicting with the least number of accesses. Buffering is particularly effective in cases of uneven (statistically speaking) concurrent access, firstly to different files, and secondly to fragments of each file. <\/p>\n<p><\/p>\n<p>The Cage class supports input\/output not only by data addresses (specifying position and length of the array, 'replacing' file system operations) but also at a lower 'physical' level \u2014 by page numbers in the buffer memory. <\/p>\n<p><\/p>\n<p>Original functionality is supported for Cage objects <i>\u2018hibernation\u2019<\/i> (\"suspend\") \u2013 they can be \"folded\" (for example, in the event of a disconnection from the servers, or when stopping the application, etc.) into a local dump file on the client-side and quickly restored from this file (after connection resumes, when the application is restarted). This significantly reduces traffic when activating the client program after a temporary \"offline\" period, as frequently used file segments will already be in the cache.<\/p>\n<p><\/p>\n<p>Cage consists of about 3600 lines of code.<\/p>\n<p><\/p>\n<h3>Principles of server architecture<\/h3>\n<p><\/p>\n<p>Cage file servers can be run on any number of ports, one of which (the \"main\") is used solely for authorizing all clients, while the others are for data exchange. The Cage server program requires only Python. Concurrently, the computer with the file server can perform any other tasks. <\/p>\n<p><\/p>\n<p>The server initially starts as a combination of two main processes:<\/p>\n<ol>\n<li><b>\"Connections\"<\/b> \u2013 a process for establishing and terminating connections with clients at the server's initiative;<\/li>\n<li><b>\"Operations\"<\/b> \u2013 a process for executing client tasks (operations) related to file handling, as well as for closing communication sessions upon client commands.<\/li>\n<\/ol>\n<p><\/p>\n<p>Both processes are unsynchronized and organized as infinite loops for receiving and sending messages based on multiprocess queues, proxy objects, locks, and sockets.<br \/>\nThe \"Connections\" process allocates a port for each client for data transmission. The number of ports is specified when the server starts. The correspondence between ports and clients is stored in shared proxy memory.<\/p>\n<p><\/p>\n<p>The \"Operations\" process supports file resource sharing, allowing multiple different clients to simultaneously (<i>quasi-parallel<\/i>, as access is managed by locks) read data from a single file, if this was permitted upon its initial opening by the \"first\" client. \n<\/p>\n<p>Commands for creating\/deleting\/opening\/closing files on <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/en\/server\/dts-dronten\/\"   title=\"server\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"2497\">server<\/a> are processed in the \"Operations\" process strictly sequentially using the server's OS file subsystem.<\/p>\n<p><\/p>\n<p>To enhance read\/write operations, these processes are carried out in threads created by the 'Operations' process. The number of threads typically equals the number of open files. Read\/write requests from clients are submitted to a common queue, and the first available thread takes the task from the head of the queue. Special logic prevents data overwriting in the server's RAM.<\/p>\n<p><\/p>\n<p>The 'Operations' process monitors client activity and stops servicing them either by their commands or when the inactivity timeout is exceeded.<\/p>\n<p><\/p>\n<p>To ensure reliability, Cageserver maintains logs of all transactions. One general log contains copies of messages from clients regarding tasks for creating\/opening\/renaming\/deleting files. For each working file, a separate log is created, which records copies of messages for reading and writing data in that working file, as well as arrays of written (new) data and arrays of data that were lost due to overwriting (writing new data 'over' old data). <\/p>\n<p><\/p>\n<p>These logs provide the ability to restore new changes from backups and to 'roll back' from the current content to a desired point in the past. <\/p>\n<p><\/p>\n<p>Cageserver consists of about 3100 lines of code.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Cage Remote File Access System\" src=\"\/wp-content\/uploads\/2019\/08\/606d593347d73274b0c172dae34da0d7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Launching the Cageserver file server program<\/h3>\n<p><\/p>\n<p>On launch, the following must be defined:<br \/>\n \u2014 the main port for authorization;<br \/>\n \u2014 the number of ports for transaction exchange with authorized clients (from 1 and more, the pool of numbers starts from the next number after the main port number).<\/p>\n<p><\/p>\n<h3>Using the Cage class<\/h3>\n<p><\/p>\n<p><b>class<\/b> cage.<b>Cage<\/b>( <i>cage_name=&gt;&gt;, pagesize=0, numpages=0, maxstrlen=0, server_ip={}, wait=0, awake=False, cache_file=&gt;&gt;<\/i> )<\/p>\n<p><\/p>\n<p>Objects are created from this class that interact with file servers and contain buffer memory.<\/p>\n<p><\/p>\n<p><b><u>Parameters<\/u><\/b><\/p>\n<p><\/p>\n<ul>\n<li> <b>cage_name<\/b>(<i>str<\/i>) \u2014 a conditional name for the object used for client identification on the server-side <\/li>\n<li> <b>pagesize<\/b>(<i>int<\/i>) \u2014 the size of one page of buffer memory (in bytes)<\/li>\n<li> <b>numpages<\/b>(<i>int<\/i>) \u2014 the number of pages of buffer memory<\/li>\n<li> <b>maxstrlen<\/b>(<i>int<\/i>) \u2014 the maximum length of a byte string in read and write operations<\/li>\n<li> <b>server_ip<\/b>(<i>dict<\/i>) \u2014 a dictionary containing the addresses used <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/en\/server\/\"   title=\"servers\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"1347\">servers<\/a>, where the key is the server's conditional name (server ID within the application), and the value is a string with the address: \u201cip address:port\u201d or \u201cDNS:port\u201d (the mapping of names and real addresses is temporary and can be changed)<\/li>\n<li> <b>wait<\/b>(<i>int<\/i>) \u2014 response time from the server when receiving ports (in seconds)<\/li>\n<li> <b>awake<\/b>(<i>boolean<\/i>) \u2014 flag indicating the method of object creation (<i>False<\/i> \u2014 if a new object is being created, <i>True<\/i> \u2014 if the object is created from a previously \u201csuspended\u201d state \u2014 using the \u201chibernation\u201d operation, defaults to False)<\/li>\n<li> <b>cache_file<\/b>(<i>str<\/i>) \u2014 filename for hibernation<\/li>\n<\/ul>\n<p><\/p>\n<p><b><u>Methods<\/u><\/b><\/p>\n<p><\/p>\n<p>Cage.<b>file_create<\/b>( <i>server, path<\/i> ) \u2013 create a new file<\/p>\n<p><\/p>\n<p>Cage.<b>file_rename<\/b>( <i>server, path, new_name<\/i> ) \u2013 rename a file<\/p>\n<p><\/p>\n<p>Cage.<b>file_remove<\/b>( <i>server, path<\/i>) \u2013 delete a file<\/p>\n<p><\/p>\n<p>Cage.<b>open<\/b>( <i>server, path, mod <\/i>) \u2013 open a file<\/p>\n<p><\/p>\n<p>Returns <i>fchannel<\/i> channel number. The parameter <i>mod<\/i> \u2014 is the file opening mode: \u201cwm\u201d \u2014 exclusive (read\/write), \u201crs\u201d \u2014 read-only, and shared read-only by other clients, \u201cws\u201d \u2014 read\/write, and shared read-only by other clients. <\/p>\n<p><\/p>\n<p>Cage.<b>close<\/b> (<i>fchannel<\/i>) \u2013 close a file<\/p>\n<p><\/p>\n<p>Cage.<b>exit <\/b>(<i>fchannel, begin, data <\/i>) \u2013 write a byte string to a file<\/p>\n<p><\/p>\n<p>Cage.<b>write <\/b>(<i>fchannel, begin, len_data<\/i> ) \u2013 read a byte string from a file<\/p>\n<p><\/p>\n<p>Cage.<b>put_pages <\/b>( <i>fchannel<\/i> ) \u2013 \u201cpushes\u201d from the buffer to the server all pages of the specified channel that have been modified. Used in algorithm points where it\u2019s necessary to ensure that all operations on the channel are physically saved in the file on the server.<\/p>\n<p><\/p>\n<p>Cage.<b>push_all<\/b> () \u2013 \u201cpushes\u201d from the buffer to the server all pages of all channels for an instance of the Cage class that have been modified. Used when it\u2019s necessary to ensure that all operations on all channels are saved on the server.<\/p>\n<p>Source: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/463085\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0444\u0430\u0439\u043b\u0430\u043c \u043d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430\u0445 \u0432 \u0441\u0435\u0442\u0438. \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u00ab\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u00bb \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 (\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435, \u0447\u0442\u0435\u043d\u0438\u0435, \u0437\u0430\u043f\u0438\u0441\u044c \u0438 \u0434\u0440.) \u043f\u0443\u0442\u0451\u043c \u043e\u0431\u043c\u0435\u043d\u0430 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f\u043c\u0438 (\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438) \u043f\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 \u0422\u0421\u0420. \u041e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u0435\u043d \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445: \u0432 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u0434\u043b\u044f \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u0438 embedded \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 (\u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u044b, \u0431\u043e\u0440\u0442\u043e\u0432\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0442.\u043f.), \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0445 \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":27748,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-37019","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0444\u0430\u0439\u043b\u0430\u043c \u043d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430\u0445 \u0432 \u0441\u0435\u0442\u0438.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/sistema-udalennogo-fajlovogo-dostupa-cage\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 Cage | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0444\u0430\u0439\u043b\u0430\u043c \u043d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430\u0445 \u0432 \u0441\u0435\u0442\u0438.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/sistema-udalennogo-fajlovogo-dostupa-cage\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:15:20+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:15:20+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Remote File Access System Cage | ProHoster","description":"Purpose of the system: Support for remote access to files on computers in the network.","canonical_url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/sistema-udalennogo-fajlovogo-dostupa-cage","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"en_US","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 Cage | ProHoster","og:description":"\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0444\u0430\u0439\u043b\u0430\u043c \u043d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430\u0445 \u0432 \u0441\u0435\u0442\u0438.","og:url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/sistema-udalennogo-fajlovogo-dostupa-cage","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:15:20+00:00","article:modified_time":"2019-10-31T19:15:20+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"37019","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-02-09 21:52:49","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:34:26","updated":"2026-02-09 21:52:49","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/37019","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/comments?post=37019"}],"version-history":[{"count":2,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/37019\/revisions"}],"predecessor-version":[{"id":159779,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/37019\/revisions\/159779"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media\/27748"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media?parent=37019"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/categories?post=37019"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/tags?post=37019"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}