{"id":19989599,"url":"https://github.com/wavesoft/cvmweb","last_synced_at":"2025-07-29T05:32:35.198Z","repository":{"id":8012594,"uuid":"9421072","full_name":"wavesoft/CVMWeb","owner":"wavesoft","description":"CernVM Web NPAPI Plugin","archived":false,"fork":false,"pushed_at":"2014-03-27T09:47:14.000Z","size":23326,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":9,"default_branch":"master","last_synced_at":"2025-03-01T20:02:11.528Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wavesoft.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2013-04-13T22:28:04.000Z","updated_at":"2015-08-26T14:47:42.000Z","dependencies_parsed_at":"2022-08-28T05:31:43.692Z","dependency_job_id":null,"html_url":"https://github.com/wavesoft/CVMWeb","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/wavesoft/CVMWeb","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wavesoft%2FCVMWeb","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wavesoft%2FCVMWeb/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wavesoft%2FCVMWeb/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wavesoft%2FCVMWeb/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wavesoft","download_url":"https://codeload.github.com/wavesoft/CVMWeb/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wavesoft%2FCVMWeb/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267633670,"owners_count":24118777,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-29T02:00:12.549Z","response_time":2574,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-13T04:48:35.426Z","updated_at":"2025-07-29T05:32:35.175Z","avatar_url":"https://github.com/wavesoft.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# What is this?\n\nThis is an NPAPI plugin for web browsers that enables real-time interaction with the CernVM guest OS. \nThis plugin identifies the hypervisors installed in the system and picks the most appropriate one to\nhost the CernVM Guest OS. \n\nIt then provides a simple interface to start/stop the VM and access it's data sets. \n\n# Testing the plugin\n\nYou can test the installation and the status of the plugin using the *test.html* file that comes with the source.\n\n# Building the plugin\n\nCVMWebAPI Plugin is built using the [FireBrath](http://www.firebreath.org/) framework. So, your very first step is to\ndownload the latest stable release of FireBreath : http://www.firebreath.org/display/documentation/Download\n\nThen create a 'projects' folder inside the extracted files:\n\n\twget https://github.com/firebreath/FireBreath/tarball/firebreath-1.7\n\ttar -zxf firebreath-FireBreath-firebreath-1.7.0-8-gb73d799.tar.gz\n\tcd firebreath-FireBreath-df8659e\n\tmkdir projects\n\nThen clone the plugin GIT repository inside the projects folder:\n\n\tgit clone https://github.com/wavesoft/CVMWeb.git CVMWeb\n\nYou can then follow the appropriate instructions for:\n\n * [How to build on OSX](http://www.firebreath.org/display/documentation/Building+on+Mac+OS+X)\n * [How to build on Linux](http://www.firebreath.org/display/documentation/Building+on+Linux)\n * [How to build on Windows](http://www.firebreath.org/display/documentation/Building+on+Windows)\n\n# Installing the Plugin\n\nThe plugin has no installation system yet, but you can install it manually using one of the following techniques.\nYou can always find the latest binary builds for your operating system in the *builds* directory.\n\n## Installing on Mac OSX\n\nCopy the plugin from the **build/projects/CVMWeb/Debug** or **build/projects/CVMWeb/Release** directory to your \n**Library/Internet Plug-Ins** directory. The plugin will be immediately available to all of your browsers.\n\n## Installation on Windows\n\nCopy the .dll to a directory that it's going to stay for the rest of it's time (ex. C:\\Program Files\\Common Files\\CernVM) and\nthen run:\n\n\tregsvr32 C:\\Program Files\\Common Files\\CernVM\\npCVMWeb.dll\n\n## Installation on Linux\n\nCopy the plugin from the **build/bin/CVMWeb** directory to your **~/.mozilla/plugins** directory. The plugin will be immediately \navailable to Firefox.\n\n## Installation on Firefox\n\n**NEW** Now the plugin is available as an .xpi plugin! (Check the builds folder). To install it, simply drag it onto a firefox\ninstance...\n\nThe .xpi plugin contains precompiled binaries for the following platforms:\n\n * Darwin/GCC3 x86 ( Mac OSX 10.2+ )\n * Darwin/GCC3 x86_64 ( Mac OSX 10.6+ )\n * Linux/GCC3 x86 (Also works on x86_64)\n * Windows XP/7 32bit (Also works on 64-bit)\n\nThe only linux platform currently tested was Ubuntu 12.04.2 LTS (32 bit) but in principle it should work on many more...\n\n# How to use the plugin\n\nTo use this plugin you must first create an embed element in your website. You must give it a unique ID:\n\n\t\u003cembed type=\"application/x-cvmweb\" id=\"cvmweb\"\u003e\n\nYou can then get a reference to the object and access it's properties:\n\n\tvar o = document.getElementById('cvmweb');\n\talert('We are running with ' + o.hypervisorName + \"/\" + e.hypervisorVersion );\n\n# Creating sessions\n\nEvery computation session is a CernVM instance and is accessed individually. You can request a session that fits your needs\nusing the requestSession function:\n\n\tvar res = o.requestSession( \"session name\", \"secret key\", success_callback, failure_callback );\n\nThe secret key prohibits unauthorized users to access your session. The first user that requests a session is automatically\nthe owner and only his secret key can be used to request access to the same session again.\n\nThis function will return 1 (HVE_SCHEDULED) if succeeded or an error code if failed. When the session is ready, the function\nprovided by the *success_callback* parameter will be called. The callback signature is the following:\n\n\t// Called when session is ready\n\tsuccess_callback( session ) {\n\t\t...\n\t}\n\t\n\t// Called if an error occured\n\tfailure_callback( error_code ) {\n\t\t...\n\t}\n\nUpon receiving the session object you can bind your event listeners using the *addEventListener(event, callback)* function. \nCheck appendix B for the events that you can handle.\n\n## Opening session\n\nThe session is unusable until the *open* function is called and the session requirements are specified:\n\n\tsess.open({ requirements })\n\nThe requirements object contains the minimum resource requirements you are asking for. If it's not specified, the default\nvalues will be used. The supported parameters and their default values are the following:\n\n\t{\n\t\tcpus: \t\t1,\n\t\tram:  \t256, \t\t// Mb\n\t\tdisk:\t\t1024,\t\t// Mb\n\t\tversion:\t'1.3'\t\t// The CernVM Micro Release\n\t}\n\nThis function will return immediately. Upon a successful completion, the *onOpen* event will be fired. If an error \noccurs the *onOpenError* event will be fired. You can also monitor the progress with the *onProgress* event.\n\n# Starting a CernVM instance\n\nTo start a CernVM instance you can use the *open* function. You must also specify the contextuaization string that will\nsetup the environment for your instance:\n\n\tvar str = \n\t\t\"[cernvm]\" +\n\t\t\"users=user:users:s3cr3t\" +\n\t\t\"shell=/bin/bash\";\n\tsess.start(str);\n\t\nThe function will return 1 if the action was scheduled successfully, or an error code if an error occurred. \t\nUpon a successful completion, the *onStart* event will be fired. If an error occurs the *onStartError* event will be fired. \n\nThe plugin will probe the CernVM communication channel periodically. When the channel is established the *onApiAvailable* event will\nbe fired. When a live connection is interrupted, the *onApiUnavailable* event will be fired.\n\n# Controlling a running instance\n\nYou can change various parameters while the VM is still running. A brief list is shown below:\n\n## Execution cap\n\nYou can change the execution cap of your application using the *setExecutionCap* function:\n\n\tsess.setExecutionCap( 50 );\t// Change Execution cap to 50%\n\talert( sess.executionCap ); // Will say '50'\n\n## Guest properties\n\nYou can set or get guest properties on hypervisors that support it using the *setProperty* and *getProperty* function:\n\n\tsess.setProperty(\"host\", \"10.110.17.67\");\n\tvar host = sess.getProperty(\"host\");\n\n## Controlling execution\n\nYou can pause, resume and stop the VM using the *pause*, *resume* and *stop* functions:\n\n\tsess.pause();\t\t// Pause session\n\tsess.resume();\t\t// Resume session\n\tsess.stop();\t\t// Power of the VM \n\tsess.hibernate();\t// Save state and shut down the VM\n\tsess.reset();\t\t// Hard-reset the VM\n\nAll these functions will also fire the *onPause*, *onResume*, *onStop*, *onHibernate* and *onReset* events, respectively.\nIf an error occurs the *onPauseError*, *onResumeError*, *onStopError*, *onHibernateError* and *onResetError* events will be fired.\nThe function will always return 1 unless the VM is not in the appropriate state for the operation, where an \n*HVE_INVALID_STATE (-8)* will be returned.\n\n## Closing session\n\nWhen you are done using the session you must close it using the *close* function:\n\n\tsess.close();\t// Poweroff VM, remove it from the hypervisor and close session\n\nWhen the VM is shut the *onClose* event will be fired. You can monitor the cleanup process by listening\nfor *onProgress* events.\n\nThe *close* function shutdown, destroy and unregister the VM. In order to use this session again you must \nrepeat the *open* procedure.\n\n# Monitoring the progress\n\nThe *open*, *start* and *close* actions are time-consuming and are executed asynchronously. You can monitor\nthe progress of their execution by listening for *onProgress* events.\n\nTake for example the following handler:\n\n\tsess.addEventListener('progress', function( current, total, msg ) {\n\t\twindow.console.log( \"Performing: \" + msg + \", \" + current + \" out of \" + total + \" tasks completed\" );\n\t});\n\n\n# Assisting daemon process\n\nSince the running VM needs to be calibrated at real-time, depending on the CPU load or other factors, a tiny daemon process\nis started along with every VM. \n\nYou can learn more about the daemon if you check the README.md in the daemon/ folder.\n\n## Checking the daemon from javascript\n\nIf you want to monitor the status of the daemon you have to request a daemon access. To do so, use the *requestDaemonAccess()* function\non the core object. Like all the request* functions, it's asynchronous and accepts two callbacks as parameters: The failure callback and the\nsuccess callback.\n\n\tvar o = document.getElementById('cvmweb'),\n\t\tdaemon = o.requestDaemonAccess(\n\t\t\tfunction(daemon) {\n\t\t\t\t// Successfully obtained daemon controlling instance\n\t\t\t}, function(errno) {\n\t\t\t\t// Unable to obtain a daemon controlling instance\n\t\t\t});\n\nThe function will either return 1 (HVE_SCHEDULED) or a negative error code if something went wrong.\n\nIf the website is not in a privileged domain you can only access the following properties:\n\n * **.isRunning** (Read-only) : Returns true if the daemon is running.\n * **.isSystemIdle** (Read-only) : Return true if the user's system is idle.\n * **.idleTime** (Read-only) : Returns the amount of time the daemon should wait before entering the idle state.\n\nIf you are in a privileged domain you get additionally the following:\n\n * **.idleTime** (Read-Write) : You can change for how long the daemon should wait\n * **.path** (Read-only) : The location of the daemon, as detected by the plugin\n * **.start()** : Manually start the daemon\n * **.stop()** : Manually stop the daemon\n\nIf you try to access the functions from a non-privileged domain they will always return *HVE_NOT_ALLOWED (-10)*.\n\n## Opting-in for daemon management\n\nIn order to control a session with the daemon you must set it's *.daemonControlled* property to *true*. You can then use the *.daemonMinCap*, *.daemonMaxCap*\nand *.daemonFlags* in order to define how the daemon will control the session. For example:\n\n\tsession.daemonControlled = true;\t// Enable daemon on this session\n\tsession.daemonMinCap = 25;\t\t\t// When the system is active, the execution cap will be at 25%\n\tsession.daemonMaxCap = 100;\t\t\t// When the system is idle, the executionc ap will be at 100%\n\nYou can use the following combinations in order to achieve different control options:\n\n\u003ctable\u003e\n  \u003ctr\u003e\n  \t\u003cth\u003e.daemonMinCap\u003c/th\u003e\n\t\u003cth\u003e.daemonMaxCap\u003c/th\u003e\n\t\u003cth\u003e.daemonFlags\u003c/th\u003e\n\t\u003cth\u003eWhat happens\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e\u0026gt; 0\u003c/td\u003e\u003ctd\u003e1 - 100\u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003eThe VM is always running and it's execution cap is changed based on system's state.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e(ignored)\u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003eThe VM is paused when the system is active and resumed when idle.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e(ignored)\u003c/td\u003e\u003ctd\u003e1\u003c/td\u003e\u003ctd\u003eThe VM is hibernated when the system is active and started when idle.\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\nThe *.daemonFlags* is a bitmask integer that defines how the daemon will control the VM. Currently the following bits are used:\n\n\u003ctable\u003e\n  \u003ctr\u003e\n  \t\u003cth\u003eBit\u003c/th\u003e\n  \t\u003cth\u003eHex value\u003c/th\u003e\n  \t\u003cth\u003eName\u003c/th\u003e\n  \t\u003cth\u003eDescription\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e0x0001\u003c/td\u003e\u003ctd\u003eDF_SUSPEND\u003c/td\u003e\u003ctd\u003eSuspend the VM instead of pausing it when .daemonMinCap is 0.\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e1\u003c/td\u003e\u003ctd\u003e0x0002\u003c/td\u003e\u003ctd\u003eDF_AUTOSTART\u003c/td\u003e\u003ctd\u003eAutomatically start the VM if it's shut down.\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n# Security considerations\n\nIt is very important to note that this is an NPAPI plugin, and therefore not protected by any browser sandbox! It can directly access your entire system!\n\nExtra care was taken to minimize the parameters that the user can specify and that can reach a system exec() command. \nOnly the **open()** function is currently passing (sanitized) integer arguments to the VBoxManage command. \n\nIn addition and in order to protect the user from unauthorized VM initiations a system-modal dialog will be appeared every time a website calls the **open()** function.\nIf the user rejects the session initiation twice within 5 seconds, no further dialogs will be displayed and all the requests will be rejected.\n\nThere is no other (known) vulnerabilities that an attacker can exploit, but be aware!\n**Accept VM initiations only from domains that you trust and only after they told you that they are going to do so!**\n\n---------------------------------------\n\n# Appendix A - Error codes\n\nMost of the functions return a number. If the value is less than zero, an error has occurred. Here is a short list of \nthe errors that can occur.\n\n\u003ctable\u003e\n  \u003ctr\u003e\n  \t\u003cth\u003eReturn Value\u003c/th\u003e\n\t\u003cth\u003eDescription\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e1\u003c/td\u003e\u003ctd\u003eSuccessfuly scheduled (status not known yet)\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003eNo error\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e-1\u003c/td\u003e\u003ctd\u003eCreation Error\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e-2\u003c/td\u003e\u003ctd\u003eModification Error\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e-3\u003c/td\u003e\u003ctd\u003eControl Error\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e-4\u003c/td\u003e\u003ctd\u003eDeletion Error\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e-5\u003c/td\u003e\u003ctd\u003eQuery Error\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e-6\u003c/td\u003e\u003ctd\u003eI/O Error\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e-7\u003c/td\u003e\u003ctd\u003eExternal library / server error\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e-8\u003c/td\u003e\u003ctd\u003eNot a valid operation for the current state\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e-9\u003c/td\u003e\u003ctd\u003eNot found\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e-10\u003c/td\u003e\u003ctd\u003eNot allowed\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e-11\u003c/td\u003e\u003ctd\u003eNot supported\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e-12\u003c/td\u003e\u003ctd\u003eNot validated\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e-13\u003c/td\u003e\u003ctd\u003eNot trusted\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e-20\u003c/td\u003e\u003ctd\u003ePassword denied\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e-99\u003c/td\u003e\u003ctd\u003eInvalid usage\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e-100\u003c/td\u003e\u003ctd\u003eFunction is not implemented\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n# Appendix B - Events\n\nThe following list of events is fired by the session object. You can listen for them using the \n*session.addEventListener* function.\n\n\tEvent name\t\t\tCallback signature\n\t---------------     -------------------------\n\topen\t\t\t\t( )\n\tstart\t\t\t\t( )\n\tclose\t\t\t\t( )\n\tpause\t\t\t\t( )\n\tresume\t\t\t\t( )\n\tstop\t\t\t\t( )\n\thibernate\t\t\t( )\n\topenError\t\t\t( errorMessage, errorCode )\n\tstartError\t\t\t( errorMessage, errorCode )\n\tcloseError\t\t\t( errorMessage, errorCode )\n\tpauseError\t\t\t( errorMessage, errorCode )\n\tresumeError\t\t\t( errorMessage, errorCode )\n\tstopError\t\t\t( errorMessage, errorCode )\n\thibernateError\t\t( errorMessage, errorCode )\n\tprogress\t\t\t( tasksCompleted, tasksPending, statusMessage )\n\terrror\t\t\t\t( errorMessage, errorCode, errorCategory )\n\tapiAvailable\t\t( machineIP, apiURL )\n\tapiUnavailable\t\t( )\n    debug\t\t\t\t( debugMessage )\n\n# Appendix C - Functions\n\nThe following list of functions is supported by the session object:\n\n\tFunction name\t\tCall signature\t\t\t\t\tReturn value\n\t---------------     -------------------------       ------------------------\n\tstart\t\t\t\t( userData )\t\t\t\t\t1 or \u003c 0 on error\n\topen\t\t\t\t( {\t\t\t\t\t\t\t\t1 or \u003c 0 on error\n\t\t\t\t\t\t\tcpus \t: \u003cint\u003e,\n\t\t\t\t\t\t\tram  \t: \u003cint\u003e,\n\t\t\t\t\t\t\tdisk \t: \u003cint\u003e,\n\t\t\t\t\t\t\tversion : \u003cstring\u003e\n\t\t\t\t\t\t} )\n\tpause\t\t\t\t( )\t\t\t\t\t\t\t\t1 or \u003c 0 on error\n\tresume\t\t\t\t( )\t\t\t\t\t\t\t\t1 or \u003c 0 on error\n\treset\t\t\t\t( )\t\t\t\t\t\t\t\t1 or \u003c 0 on error\n\tclose\t\t\t\t( )\t\t\t\t\t\t\t\t1 or \u003c 0 on error\n\thibernate\t\t\t( )\t\t\t\t\t\t\t\t1 or \u003c 0 on error\n\tsetProperty\t\t\t( propertyName, propertyValue ) 0 or \u003c 0 on error\n\tgetProperty\t\t\t( propertyName )\t\t\t\tstring\n\tsetExecutionCap\t\t( cap )\t\t\t\t\t\t\t0 or \u003c 0 on error\n\n# Appendix C - Properties\n\nThe following list of properties exist in the session objects:\n\n\tProperty name\t\tDescription\n\t---------------     -------------------\n\tip\t\t\t\t\tThe IP address of the VM (not yet supported)\n\tcpus\t\t\t\tThe number of cpus\n\tstate\t\t\t\tThe state of the VM\n\tram\t\t\t\t\tThe ammount of memory (in MB) used\n\tdisk \t\t\t\tThe ammount of memory (in MB) allocated for the disk\n\tversion\t\t\t\tThe version of CernVM-Micro used\n\texecutionCap\t\tThe current execution cap\n\tapiURL\t\t\t\tThe URL inside the VM to contact for API operations\n\trdpURL\t\t\t\tThe hostname and the port for the display\n\tdaemonControlled\tTRUE if the session is managed by the daemon\n\tdaemonMinCap\t\tThe min (active) cap of the VM\n\tdaemonMaxCap\t\tThe max (idle) cap of the VM\n\tdaemonFlags\t\t\tAdditional flags to define how the daemon will control the VM\n\n# Appendix D - State constants\n\nThe *sess.state* property has one of the following values:\n\n\tState\t\t\tDescription\n\t------------    -----------------\n\t0\tClosed\t\tThe session is closed. You must call open()\n\t1\tOppening\tThe open() function was called, but the session is not yet ready\n\t2\tOpen\t\tThe session is open, you can call start() to start it\n\t3\tStarting\tThe start() function was called, but the session is not yet started\n\t4\tStarted\t\tThe VM is running, you can now call pause(), resume(), reset() or stop()\n\t5\tError\t\tThere was an error starting the VM\n\t6\tPaused\t\tThe session is open but the VM is paused\n\n---------------------------------------\n\n# License\n\nCVMWebAPI is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nCVMWebAPI is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with CVMWebAPI. If not, see \u003chttp://www.gnu.org/licenses/\u003e.\n\nDeveloped by Ioannis Charalampidis, 2013\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwavesoft%2Fcvmweb","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwavesoft%2Fcvmweb","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwavesoft%2Fcvmweb/lists"}