@@ -3,8 +3,10 @@ package main
33import (
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 (
1517var cmd * exec.Cmd
1618
1719func 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