Skip to content

Commit 579887f

Browse files
committed
...
1 parent 275b380 commit 579887f

File tree

3 files changed

+663
-30
lines changed

3 files changed

+663
-30
lines changed

README.md

Lines changed: 52 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
1+
# 甲骨文实例抢购教程
2+
13
## 获取用户 OCID 和租户 OCID
24
登录甲骨文网站
35
1. 点击右上角头像 -> 点击类似 oracleidentitycloudservice/xxx@xx.com 的条目,进入后即可看到用户的 OCID。
46
2. 点击右上角头像 -> 点击类似 租户:xxx 的条目, 进入页面后即可获取租户的 OCID。
57

6-
## 获取其它参数
7-
### 方法1
8+
## 获取创建实例需要的参数
9+
### 方法一
810
登录甲骨文网站,创建实例--保存为堆栈(Save as stack),下载 Terraform 配置,解压得到 main.tf 用文本编辑器打开即可。
9-
### 方法2
11+
### 方法二
1012
登录甲骨文网站,创建实例,按F12打开浏览器开发者工具,点击创建实例发起请求,在开发者工具的网络中找到对应的网络请求获取参数。
1113

12-
## 安装并配置 OCI
13-
### 安装
14+
## 安装并配置 OCI-Cli
15+
### 安装 OCI-Cli
1416
#### Linux
1517
```
1618
bash -c "$(curl -L https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.sh)"
@@ -28,7 +30,7 @@ brew install oci-cli
2830
oci -v
2931
```
3032

31-
### 配置
33+
### 配置 OCI-Cli
3234
执行下面命令配置 OCI
3335
```
3436
oci setup config
@@ -49,18 +51,54 @@ cat ~/.oci/oci_api_key_public.pem
4951
oci iam availability-domain list
5052
```
5153

52-
## 开始创建实例
53-
根据系统类型下载对应的可执行文件 https://github.com/lemoex/oci-help/releases/latest
54+
## Telegram Bot 消息提醒
55+
如果需要通过 Telegram Bot 发送抢购实例成功的提醒,需要创建机器人获取 token 并获取用户的 id。
56+
1. 通过 [BotFather](https://t.me/BotFather) 创建一个 Bot 获取 token。
57+
2. 通过 [IDBot](https://t.me/myidbot) 获取用户 id。
58+
59+
## 开始抢购实例
60+
### 方法一(使用编译好的 go 可执行程序抢购实例)
61+
根据系统类型下载对应的可执行文件 [下载地址](https://github.com/lemoex/oci-help/releases/latest)
5462
解压后,执行下面命令运行程序
5563
```
5664
./oci-help
5765
```
58-
输入 2 并回车,根据第一步获取的参数,输入后即可开始创建实例。
66+
Telegram Bot 消息提醒配置:
67+
运行程序后,在主菜单选择第 3 项 [ Telegram Bot 消息提醒 ],接着选择第 1 项设置 [ token 和用户 id ]
68+
开始抢购实例:
69+
主菜单选择第 2 项 [ 新建抢购实例任务 ],根据提示输入对应的参数即可开始抢购实例。
5970

60-
## Telegram 消息提醒配置
61-
通过 [BotFather](https://t.me/BotFather) 创建一个 Bot 获取 token,
62-
通过 [IDBot](https://t.me/myidbot) 获取用户 id。
63-
执行下面命令运行程序,选择第 3 项,接着选择第 1 项设置 token 和用户 id,输入 token 和用户 id 即可。
71+
> 当程序意外停止或者手动终止后,运行程序后在主菜单选择第 1 项 [ 历史抢购实例任务 ] 可以查看之前添加的抢购实例任务,输入对应的序号即可开始抢购实例。
72+
73+
### 方法二
74+
下载 [oci-help.sh](https://github.com/lemoex/oci-help/blob/main/shell/oci-help.sh) 脚本。
75+
用文本编辑器打开 oci-help.sh,根据上面获取到的参数修改脚本。保存后通过下面命令运行脚本开始新建或者升级实例。
6476
```
65-
./oci-help
77+
# 新建实例
78+
./oci-help.sh --launch
79+
# 升级实例
80+
./oci-help.sh --update
6681
```
82+
83+
## 使用 screen 在后台运行
84+
### 在 screen 会话中运行程序
85+
```
86+
# 在 screen 中运行 oci-help
87+
screen -S oci-help ./oci-help
88+
89+
# 在 screen 中运行新建实例命令
90+
screen -S oci-help ./oci-help.sh --launch
91+
# 在 screen 中运行升级实例命令
92+
screen -S oci-help ./oci-help.sh --update
93+
```
94+
95+
### 从 screen 会话中分离
96+
按住 Ctrl 键不松,依次按字母 A 和 D 键,即可从当前screen中分离;或者直接关闭终端窗口。
97+
98+
### 重新连接 screen 会话
99+
```
100+
screen -r oci-help
101+
```
102+
103+
### 终止 screen 会话
104+
在 screen 会话中 按下 Ctrl 不松,按下字母 D 键,即可终止该 screen 会话。

main.go

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,11 @@ var name string
2727
type Result struct {
2828
Status json.Number `json:"status"`
2929
Message string `json:"message"`
30-
Data interface{} `json:"data"`
30+
Data Data `json:"data"`
31+
}
32+
type Data struct {
33+
InstanceName string `json:"display-name"`
34+
Shape string `json:"shape"`
3135
}
3236

3337
type Node struct {
@@ -61,10 +65,10 @@ func main() {
6165

6266
func mainMenu() {
6367
cmdClear()
64-
fmt.Printf("\n\033[1;32;40m%s\033[0m\n\n", "欢迎使用甲骨文新建实例脚本")
65-
fmt.Printf("\033[1;36;40m%s\033[0m %s\n", "1.", "查看新建记录")
66-
fmt.Printf("\033[1;36;40m%s\033[0m %s\n", "2.", "开始新建实例")
67-
fmt.Printf("\033[1;36;40m%s\033[0m %s\n", "3.", "Telegram bot 消息提醒")
68+
fmt.Printf("\n\033[1;32;40m%s\033[0m\n\n", "欢迎使用甲骨文实例抢购脚本")
69+
fmt.Printf("\033[1;36;40m%s\033[0m %s\n", "1.", "历史抢购实例任务")
70+
fmt.Printf("\033[1;36;40m%s\033[0m %s\n", "2.", "新建抢购实例任务")
71+
fmt.Printf("\033[1;36;40m%s\033[0m %s\n", "3.", "Telegram Bot 消息提醒")
6872
fmt.Println("")
6973
fmt.Print("请选择[1-3]: ")
7074
var num int
@@ -82,13 +86,13 @@ func mainMenu() {
8286
func loadNode() {
8387
cmdClear()
8488
sections := cfg.Sections()
85-
fmt.Printf("\n\033[1;32;40m%s\033[0m\n\n", "新建实例历史记录")
89+
fmt.Printf("\n\033[1;32;40m%s\033[0m\n\n", "历史抢购实例任务")
8690
for i := 1; i < len(sections); i++ {
8791
fmt.Printf("\033[1;36;40m%d.\033[0m %s\n", i, sections[i].Name())
8892
}
8993
fmt.Printf("\n\033[1;36;40m%d.\033[0m %s\n", 0, "返回主菜单")
9094
var num int
91-
fmt.Print("\n请输入序号, 开始新建实例: ")
95+
fmt.Print("\n请输入序号, 开始抢购实例: ")
9296
fmt.Scanln(&num)
9397
if num <= 0 || num >= len(sections) {
9498
mainMenu()
@@ -120,7 +124,7 @@ func addNode() {
120124
min_time string
121125
max_time string
122126
)
123-
fmt.Printf("\n\033[1;32;40m%s\033[0m\n\n", "开始新建实例, 请按要求输入以下参数")
127+
fmt.Printf("\n\033[1;32;40m%s\033[0m\n\n", "新建抢购实例任务, 请按要求输入以下参数")
124128
fmt.Print("请随便输入一个名称(不能有空格): ")
125129
fmt.Scanln(&name)
126130
fmt.Print("请输入[availabilityDomain|availability_domain]: ")
@@ -174,7 +178,7 @@ func addNode() {
174178

175179
func setTelegramBot() {
176180
cmdClear()
177-
fmt.Printf("\n\033[1;32;40m%s\033[0m\n\n", "Telegram bot 消息提醒配置")
181+
fmt.Printf("\n\033[1;32;40m%s\033[0m\n\n", "Telegram Bot 消息提醒配置")
178182
fmt.Println("Telegram Bot Token:", tg_token)
179183
fmt.Println("Telegram User ID:", tg_chatId)
180184
fmt.Printf("\n\033[1;36;40m%s\033[0m %s\n", "1.", "设置token和用户id")
@@ -214,7 +218,7 @@ func sendMessage(name, text string) {
214218

215219
func launchInstance(node *Node) {
216220
name = node.Name
217-
text := "开始创建实例"
221+
text := "开始抢购实例"
218222
printGreen(text)
219223
sendMessage(node.Name, text)
220224
cmd := "oci"
@@ -233,17 +237,24 @@ func launchInstance(node *Node) {
233237
}
234238

235239
for {
236-
out, _ := exec.Command(cmd, args...).CombinedOutput()
240+
out, err := exec.Command(cmd, args...).CombinedOutput()
237241
ret := string(out)
242+
if err != nil {
243+
text = "抢购失败, Command failed. " + err.Error() + "\n" + ret
244+
printRed(text)
245+
sendMessage(node.Name, text)
246+
return
247+
}
248+
238249
pos := strings.Index(ret, "{")
239250
if pos != -1 {
240251
ret = ret[pos:]
241252
}
242253

243254
var result Result
244-
err := json.Unmarshal([]byte(ret), &result)
255+
err = json.Unmarshal([]byte(ret), &result)
245256
if err != nil {
246-
text = "出现异常, " + ret
257+
text = "抢购失败, Unmarshal failed. " + "\n" + ret
247258
printRed(text)
248259
sendMessage(node.Name, text)
249260
return
@@ -253,13 +264,13 @@ func launchInstance(node *Node) {
253264
case "500", "429":
254265
printNone(result.Message)
255266
default:
256-
if result.Data != nil {
257-
text = "实例创建成功"
267+
if result.Data != (Data{}) {
268+
text = "抢购成功, 实例名称: [" + result.Data.InstanceName + "]"
258269
printGreen(text)
259270
sendMessage(node.Name, text)
260271
return
261272
}
262-
text = "出现异常, " + result.Message
273+
text = "抢购失败, " + result.Message
263274
printRed(text)
264275
sendMessage(node.Name, text)
265276
return

0 commit comments

Comments
 (0)