forked from DevOps/deploy.stack
实现一个基于Golang的MCP时间服务器,提供获取当前时间和日期功能 包含客户端示例、安装脚本和详细文档 refactor: 优化磁盘巡检脚本以支持SAS和SSD硬盘 增强磁盘巡检脚本的兼容性,改进SMART信息解析逻辑 添加硬盘类型检测和更全面的错误处理 docs: 更新README和安装说明 添加MCP时间服务器的使用文档和API说明 完善磁盘巡检报告格式和内容
190 lines
4.5 KiB
Go
190 lines
4.5 KiB
Go
package main
|
||
|
||
import (
|
||
"bytes"
|
||
"encoding/json"
|
||
"fmt"
|
||
"io/ioutil"
|
||
"net/http"
|
||
"time"
|
||
)
|
||
|
||
// 这里使用通用的map类型表示请求和响应,避免与main.go中的结构体冲突
|
||
|
||
func main() {
|
||
// 服务器地址
|
||
serverURL := "http://localhost:8080"
|
||
|
||
// 1. 测试健康检查
|
||
testHealthCheck(serverURL)
|
||
|
||
// 2. 测试获取当前时间(默认格式)
|
||
testGetCurrentTime(serverURL, "")
|
||
|
||
// 3. 测试获取当前时间(自定义格式)
|
||
testGetCurrentTime(serverURL, "2006-01-02 15:04:05")
|
||
|
||
// 4. 测试订阅时间流
|
||
testSubscribeTimeStream(serverURL)
|
||
}
|
||
|
||
// 测试健康检查
|
||
func testHealthCheck(serverURL string) {
|
||
url := fmt.Sprintf("%s/health", serverURL)
|
||
resp, err := http.Get(url)
|
||
if err != nil {
|
||
fmt.Printf("健康检查请求失败: %v\n", err)
|
||
return
|
||
}
|
||
defer resp.Body.Close()
|
||
|
||
if resp.StatusCode == http.StatusOK {
|
||
fmt.Println("✅ 健康检查成功: 服务器正常运行")
|
||
} else {
|
||
fmt.Printf("❌ 健康检查失败: 状态码 %d\n", resp.StatusCode)
|
||
}
|
||
}
|
||
|
||
// 测试获取当前时间
|
||
func testGetCurrentTime(serverURL string, format string) {
|
||
url := fmt.Sprintf("%s/mcp/v1/submit", serverURL)
|
||
|
||
// 构建请求体
|
||
requestBody := map[string]interface{}{
|
||
"data": map[string]interface{}{},
|
||
"type": "get_current_time",
|
||
"timestamp": time.Now().Unix(),
|
||
}
|
||
|
||
// 添加格式参数(如果提供)
|
||
if format != "" {
|
||
data := requestBody["data"].(map[string]interface{})
|
||
data["format"] = format
|
||
}
|
||
|
||
// 序列化请求体
|
||
jsonData, err := json.Marshal(requestBody)
|
||
if err != nil {
|
||
fmt.Printf("序列化请求体失败: %v\n", err)
|
||
return
|
||
}
|
||
|
||
// 发送POST请求
|
||
resp, err := http.Post(url, "application/json", bytes.NewBuffer(jsonData))
|
||
if err != nil {
|
||
fmt.Printf("发送请求失败: %v\n", err)
|
||
return
|
||
}
|
||
defer resp.Body.Close()
|
||
|
||
// 读取响应
|
||
body, err := ioutil.ReadAll(resp.Body)
|
||
if err != nil {
|
||
fmt.Printf("读取响应失败: %v\n", err)
|
||
return
|
||
}
|
||
|
||
// 解析响应为map
|
||
var response map[string]interface{}
|
||
if err := json.Unmarshal(body, &response); err != nil {
|
||
fmt.Printf("解析响应失败: %v\n", err)
|
||
return
|
||
}
|
||
|
||
// 检查响应状态
|
||
success, ok := response["success"].(bool)
|
||
if !ok || !success {
|
||
message := "未知错误"
|
||
if msg, ok := response["message"].(string); ok {
|
||
message = msg
|
||
}
|
||
fmt.Printf("❌ 获取当前时间失败: %s\n", message)
|
||
return
|
||
}
|
||
|
||
// 提取数据
|
||
data, ok := response["data"].(map[string]interface{})
|
||
if !ok {
|
||
fmt.Println("❌ 响应数据格式错误")
|
||
return
|
||
}
|
||
|
||
// 获取时间信息
|
||
currentTime, _ := data["current_time"].(string)
|
||
timestamp, _ := data["timestamp"].(float64)
|
||
fmt.Printf("✅ 获取当前时间成功 (格式: %s):\n", format)
|
||
fmt.Printf(" 时间: %s\n", currentTime)
|
||
fmt.Printf(" 时间戳: %.0f\n", timestamp)
|
||
}
|
||
|
||
// 测试订阅时间流
|
||
func testSubscribeTimeStream(serverURL string) {
|
||
url := fmt.Sprintf("%s/mcp/v1/submit", serverURL)
|
||
|
||
// 构建请求体
|
||
requestBody := map[string]interface{}{
|
||
"data": map[string]interface{}{
|
||
"interval": 2, // 每2秒更新一次
|
||
"format": "2006-01-02 15:04:05",
|
||
},
|
||
"type": "subscribe_time_stream",
|
||
"timestamp": time.Now().Unix(),
|
||
}
|
||
|
||
// 序列化请求体
|
||
jsonData, err := json.Marshal(requestBody)
|
||
if err != nil {
|
||
fmt.Printf("序列化请求体失败: %v\n", err)
|
||
return
|
||
}
|
||
|
||
// 发送POST请求
|
||
resp, err := http.Post(url, "application/json", bytes.NewBuffer(jsonData))
|
||
if err != nil {
|
||
fmt.Printf("发送请求失败: %v\n", err)
|
||
return
|
||
}
|
||
defer resp.Body.Close()
|
||
|
||
// 读取响应
|
||
body, err := ioutil.ReadAll(resp.Body)
|
||
if err != nil {
|
||
fmt.Printf("读取响应失败: %v\n", err)
|
||
return
|
||
}
|
||
|
||
// 解析响应为map
|
||
var response map[string]interface{}
|
||
if err := json.Unmarshal(body, &response); err != nil {
|
||
fmt.Printf("解析响应失败: %v\n", err)
|
||
return
|
||
}
|
||
|
||
// 检查响应状态
|
||
success, ok := response["success"].(bool)
|
||
if !ok || !success {
|
||
message := "未知错误"
|
||
if msg, ok := response["message"].(string); ok {
|
||
message = msg
|
||
}
|
||
fmt.Printf("❌ 订阅时间流失败: %s\n", message)
|
||
return
|
||
}
|
||
|
||
// 提取数据
|
||
data, ok := response["data"].(map[string]interface{})
|
||
if !ok {
|
||
fmt.Println("❌ 响应数据格式错误")
|
||
return
|
||
}
|
||
|
||
// 获取流信息
|
||
streamID, _ := data["stream_id"].(string)
|
||
sseURL, _ := data["sse_url"].(string)
|
||
interval, _ := data["interval"].(float64)
|
||
fmt.Printf("✅ 订阅时间流成功:\n")
|
||
fmt.Printf(" 流ID: %s\n", streamID)
|
||
fmt.Printf(" SSE URL: %s\n", sseURL)
|
||
fmt.Printf(" 更新间隔: %.0f秒\n", interval)
|
||
fmt.Println(" 提示: 可以使用curl或浏览器访问SSE URL来接收实时时间更新")
|
||
} |