Skip to content

Commit b04c56b

Browse files
committed
🎉 Auto Upgrade Camera Python File
1 parent 68c1e96 commit b04c56b

1 file changed

Lines changed: 105 additions & 9 deletions

File tree

api.go

Lines changed: 105 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ package main
33
import (
44
"encoding/json"
55
"fmt"
6+
"io"
67
"log"
78
"net"
9+
"net/http"
810
"os"
911
"os/exec"
1012
"strconv"
@@ -15,10 +17,12 @@ import (
1517
var cmd *exec.Cmd
1618

1719
func RunApi(chapi chan bool, MyID uint32) {
18-
// python3 main.py を実行する
19-
cmd = exec.Command("python3", "main.py")
20-
//コマンドを実行
21-
cmd.Start()
20+
// GitHubから最新のmain.pyを取得してPythonプロセスを開始
21+
err := restartPythonProcess()
22+
if err != nil {
23+
log.Printf("Pythonプロセス開始エラー(プログラムは継続します): %v", err)
24+
// エラーがあってもAPIサーバーは継続
25+
}
2226
//ポートを開く
2327
listener, err := net.Listen("tcp", PORT)
2428
if err != nil {
@@ -144,6 +148,20 @@ func HandleRequest(conn net.Conn) {
144148

145149
}
146150

151+
if strings.Split(requests[1], "/")[1] == "updatepython" {
152+
// OK と表示
153+
fmt.Fprintf(conn, "HTTP/1.1 200 OK\r\n")
154+
fmt.Fprintf(conn, "Content-Type: text/plain; charset=utf-8\r\n\r\n")
155+
fmt.Fprintf(conn, "UPDATE PYTHON OK\r\n")
156+
157+
// Pythonプロセスを再起動(GitHubからの更新チェック付き)
158+
err := restartPythonProcess()
159+
if err != nil {
160+
log.Printf("Pythonプロセス再起動エラー: %v", err)
161+
}
162+
return
163+
}
164+
147165
if strings.Split(requests[1], "/")[1] == "changeadjustment" {
148166
// /changeadjustment/1,120,100/15,255,255/150/0.2これを受け取る
149167
// /120,100,15をとる
@@ -196,12 +214,10 @@ func HandleRequest(conn net.Conn) {
196214
fmt.Fprintf(conn, "500 Internal Server Error\r\n")
197215
}
198216

199-
cmd.Process.Kill()
200-
cmd = exec.Command("python3", "main.py")
201-
202-
err = cmd.Start()
217+
// Pythonプロセスを再起動(GitHubからの更新チェック付き)
218+
err = restartPythonProcess()
203219
if err != nil {
204-
log.Println(err)
220+
log.Printf("Pythonプロセス再起動エラー: %v", err)
205221
}
206222

207223
return
@@ -234,3 +250,83 @@ func HandleRequest(conn net.Conn) {
234250
fmt.Fprint(conn, response)
235251

236252
}
253+
254+
// GitHubからmain.pyを取得して更新が必要かチェックし、必要に応じて更新する
255+
func updateMainPyFromGitHub() error {
256+
const githubURL = "https://raw.githubusercontent.com/Rione/ssl-RACOON-Pi2/refs/heads/master/main.py"
257+
258+
// タイムアウト付きHTTPクライアントを作成
259+
client := &http.Client{
260+
Timeout: 5 * time.Second,
261+
}
262+
263+
// GitHubからファイルを取得
264+
resp, err := client.Get(githubURL)
265+
if err != nil {
266+
return fmt.Errorf("gitHubからファイルを取得できませんでした: %v", err)
267+
}
268+
defer resp.Body.Close()
269+
270+
if resp.StatusCode != http.StatusOK {
271+
return fmt.Errorf("httpエラー: %d", resp.StatusCode)
272+
}
273+
274+
// GitHubのファイル内容を読み取り
275+
githubContent, err := io.ReadAll(resp.Body)
276+
if err != nil {
277+
return fmt.Errorf("レスポンス読み取りエラー: %v", err)
278+
}
279+
280+
// 現在のローカルファイルを読み取り
281+
localContent, err := os.ReadFile("main.py")
282+
if err != nil {
283+
// ファイルが存在しない場合は新規作成
284+
log.Println("ローカルのmain.pyが見つかりません。新規作成します。")
285+
} else {
286+
// ファイル内容を比較
287+
if string(localContent) == string(githubContent) {
288+
log.Println("main.pyは最新です。更新の必要はありません。")
289+
return nil
290+
}
291+
}
292+
293+
// ファイルを更新
294+
err = os.WriteFile("main.py", githubContent, 0644)
295+
if err != nil {
296+
return fmt.Errorf("ファイル書き込みエラー: %v", err)
297+
}
298+
299+
log.Println("main.pyが正常に更新されました。")
300+
return nil
301+
}
302+
303+
// Pythonプロセスを停止して再起動する
304+
func restartPythonProcess() error {
305+
// 既存のプロセスを停止
306+
if cmd != nil && cmd.Process != nil {
307+
log.Println("既存のPythonプロセスを停止します。")
308+
err := cmd.Process.Kill()
309+
if err != nil {
310+
log.Printf("プロセス停止エラー: %v", err)
311+
}
312+
cmd.Wait() // プロセスの終了を待つ
313+
}
314+
315+
// GitHubから最新のmain.pyを取得・更新を試行
316+
err := updateMainPyFromGitHub()
317+
if err != nil {
318+
log.Printf("main.py更新エラー(ローカルファイルで継続): %v", err)
319+
// エラーがあってもローカルのファイルで実行を継続
320+
}
321+
322+
// 新しいプロセスを開始
323+
log.Println("Pythonプロセスを開始します。")
324+
cmd = exec.Command("python3", "main.py")
325+
err = cmd.Start()
326+
if err != nil {
327+
return fmt.Errorf("pythonプロセス開始エラー: %v", err)
328+
}
329+
330+
log.Println("Pythonプロセスが正常に開始されました。")
331+
return nil
332+
}

0 commit comments

Comments
 (0)