hostname = $hostname; $this->libpath = $libpath; $this->port = intval($port); } /** * * connect 连接服务器 * * @param $username SSH 用户名 * @param $password SSH 密码 * */ public function connect($username = "", $password = "") { if(!$this->hostname || !$this->port || !$this->libpath) { throw new HostUndefineException(); } else { try { $this->conn = ssh2_connect($this->hostname, $this->port); ssh2_auth_password($this->conn, $username, $password); if($this->runCommand("whoami") == "") { throw new LoginFailedException(); } } catch (Exception $e) { die($e->getMessage()); } } } /** * * runCommand 执行 Shell 命令 * * @param $data 需要执行的命令 * */ public function runCommand($data) { if(!$this->conn) { throw new NoConnectionException(); } $stream = ssh2_exec($this->conn, $data); stream_set_blocking($stream, true); $stream_out = ssh2_fetch_stream($stream, SSH2_STREAM_STDIO); return stream_get_contents($stream_out); } /** * * getList 获取当前主机上的所有虚拟机 * * @return Array 虚拟机列表 * */ public function getList() { if(!$this->conn) { throw new NoConnectionException(); } $list = $this->runCommand("virsh list --all --name"); $list = explode("\n", $list); $data = array(); foreach($list as $item) { if($item !== "") { $data[count($data)] = $item; } } return $data; } /** * * start 启动指定的虚拟机 * * @param $server 虚拟机名称 * @return String 执行结果 * */ public function start($server) { if(!$this->conn) { throw new NoConnectionException(); } return $this->runCommand("virsh start {$server}"); } /** * * destroy 强制关闭指定的虚拟机 * * @param $server 虚拟机名称 * @return String 执行结果 * */ public function destroy($server) { if(!$this->conn) { throw new NoConnectionException(); } return $this->runCommand("virsh destroy {$server}"); } /** * * shutdown 关闭指定的虚拟机 * * @param $server 虚拟机名称 * @return String 执行结果 * */ public function shutdown($server) { if(!$this->conn) { throw new NoConnectionException(); } return $this->runCommand("virsh shutdown {$server}"); } /** * * reboot 重启指定的虚拟机 * * @param $server 虚拟机名称 * @return String 执行结果 * */ public function reboot($server) { if(!$this->conn) { throw new NoConnectionException(); } return $this->runCommand("virsh reboot {$server}"); } /** * * suspend 暂停指定的虚拟机 * * @param $server 虚拟机名称 * @return String 执行结果 * */ public function suspend($server) { if(!$this->conn) { throw new NoConnectionException(); } return $this->runCommand("virsh suspend {$server}"); } /** * * resume 恢复指定的虚拟机 * * @param $server 虚拟机名称 * @return String 执行结果 * */ public function resume($server) { if(!$this->conn) { throw new NoConnectionException(); } return $this->runCommand("virsh resume {$server}"); } /** * * save 将指定的虚拟机状态转储到文件 * * @param $server 虚拟机名称 * @param $name 文件名 * @return String 执行结果 * */ public function save($server, $name) { if(!$this->conn) { throw new NoConnectionException(); } return $this->runCommand("virsh save {$server} {$name}"); } /** * * restore 从文件中恢复虚拟机的状态 * * @param $name 文件名 * @return String 执行结果 * */ public function restore($name) { if(!$this->conn) { throw new NoConnectionException(); } return $this->runCommand("virsh restore {$name}"); } /** * * define 载入指定的虚拟机配置文件 * * @param $xmlfile XML 文件路径和名称 * @return String 执行结果 * */ public function define($xmlfile) { if(!$this->conn) { throw new NoConnectionException(); } return $this->runCommand("virsh define {$xmlfile}"); } /** * * undefine 移除指定的虚拟机 * * @param $server 虚拟机名称 * @return String 执行结果 * */ public function undefine($server) { if(!$this->conn) { throw new NoConnectionException(); } return $this->runCommand("virsh undefine {$server}"); } /** * * dumpxml 输出指定的虚拟机的配置文件 * * @param $server 虚拟机名称 * @return String 虚拟机配置文件 * */ public function dumpxml($server) { if(!$this->conn) { throw new NoConnectionException(); } return $this->runCommand("virsh dumpxml {$server}"); } /** * * getInfo 获取指定的虚拟机的配置信息 * * @param $server 虚拟机名称 * @return Array 虚拟机配置信息数组 * */ public function getInfo($server) { if(!$this->conn) { throw new NoConnectionException(); } $info = $this->runCommand("virsh dominfo {$server}"); $info = explode("\n", $info); $data = array(); foreach($info as $item) { if($item !== "") { $exp = explode(": ", $item); $key = trim($exp[0]); $value = trim($exp[1]); $data[$key] = $value; } } return $data; } /** * * createVMXML 创建新的虚拟机配置并上传至服务器 * * @param $server 名称 * @param $vcpu CPU 数量 * @param $memory 运行内存 * @param $disk 磁盘镜像路径 * @param $iso ISO 镜像路径 * @param $boot 首选启动设备 * @param $network_type 网卡类型 * @param $network_name 网卡名称 * @param $network_mac 网卡 MAC 地址 * @param $network_bridge 网卡桥接名称 * @param $bandwidth_in 限制下行最大速率(0为不限制) * @param $bandwidth_out 限制上行最大速率(0为不限制) * @param $vnc_port VNC 远程连接端口 * */ public function createVMXML($server, $vcpu, $memory, $disk = "", $iso = "", $boot = "hd", $network_type = "network", $network_name = "default", $network_mac = "", $network_bridge = "", $bandwidth_in = 0, $bandwidth_out = 0, $vnc_port = 5900) { // 这一段写的非常骚气请不要在意 $template = " {$server} {$uuid} {$memory} {$memory} {$vcpu} /machine hvm destroy restart destroy /usr/libexec/qemu-kvm "; // 如果设置了磁盘文件 if($disk !== "") { $template .= "
"; } // 如果设置了 ISO 镜像 if($iso !== "") { $template .= "
"; } // 判断网络类型,选择不同的标签 $tag_name = "network"; if($network_type !== "network") { $tag_name = "name"; } $template .= "
"; // 如果设置了最大宽带速率 if($bandwidth_in !== 0 && $bandwidth_out !== 0) { $template .= " "; } $template .= "