W: Failed to fetch

เวลาที่  sudo apt-get install อะไรสักอย่างแล้วมันขึ้น
E: Unable to locate package xxx

ในเน็ตเค้าก็จะแนะนำให้ sudo apt-get update ก่อน
แต่มันก็ขึ้น W: Failed to fetch อีก

วิธีแก้ไขคือ ให้เราเคลียร์ข้างในโฟลเดอร์ /var/lib/apt/lists ซึ่งเก็บข้อมูลแพคเกจต่างๆไว้
โดยการ rename หรือ move มันไปไว้ที่อื่น sudo mv /var/lib/apt/lists ~/
**ไม่ควรลบทิ้ง เดี่ยวอะไรหายไปแล้วจะกู้คืนไม่ได้ วุ่นวายหนักกว่าเดิม

ลอง sudo apt-get update อีกรอบ น่าจะไม่มี warning/error ใดๆ
แต่ถ้ามันไม่ได้ ก็ลอง copy ไฟล์ /etc/apt/sources.list จากเครื่องที่ install package ได้มาใส่อีกเครื่องดู (จริงๆแค่เขียน repository เพิ่มเข้าไปข้างในไฟล์ก็ได้ แต่ก็ไม่รู้ว่าต้องเขียนอะไร)

#deb cdrom:[Ubuntu 20.04.3 LTS _Focal Fossa_ - Release amd64 (20210819)]/ focal main restricted

# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb http://jp.archive.ubuntu.com/ubuntu/ focal main restricted
# deb-src http://jp.archive.ubuntu.com/ubuntu/ focal main restricted

## Major bug fix updates produced after the final release of the
## distribution.
deb http://jp.archive.ubuntu.com/ubuntu/ focal-updates main restricted
# deb-src http://jp.archive.ubuntu.com/ubuntu/ focal-updates main restricted

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb http://jp.archive.ubuntu.com/ubuntu/ focal universe
# deb-src http://jp.archive.ubuntu.com/ubuntu/ focal universe
deb http://jp.archive.ubuntu.com/ubuntu/ focal-updates universe
# deb-src http://jp.archive.ubuntu.com/ubuntu/ focal-updates universe

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu 
## team, and may not be under a free licence. Please satisfy yourself as to 
## your rights to use the software. Also, please note that software in 
## multiverse WILL NOT receive any review or updates from the Ubuntu
## security team.
deb http://jp.archive.ubuntu.com/ubuntu/ focal multiverse
# deb-src http://jp.archive.ubuntu.com/ubuntu/ focal multiverse
deb http://jp.archive.ubuntu.com/ubuntu/ focal-updates multiverse
# deb-src http://jp.archive.ubuntu.com/ubuntu/ focal-updates multiverse

## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
deb http://jp.archive.ubuntu.com/ubuntu/ focal-backports main restricted universe multiverse
# deb-src http://jp.archive.ubuntu.com/ubuntu/ focal-backports main restricted universe multiverse

## Uncomment the following two lines to add software from Canonical's
## 'partner' repository.
## This software is not part of Ubuntu, but is offered by Canonical and the
## respective vendors as a service to Ubuntu users.
# deb http://archive.canonical.com/ubuntu focal partner
# deb-src http://archive.canonical.com/ubuntu focal partner

deb http://security.ubuntu.com/ubuntu focal-security main restricted
# deb-src http://security.ubuntu.com/ubuntu focal-security main restricted
deb http://security.ubuntu.com/ubuntu focal-security universe
# deb-src http://security.ubuntu.com/ubuntu focal-security universe
deb http://security.ubuntu.com/ubuntu focal-security multiverse
# deb-src http://security.ubuntu.com/ubuntu focal-security multiverse

# This system was installed using small removable media
# (e.g. netinst, live or single CD). The matching "deb cdrom"
# entries were disabled at the end of the installation process.
# For information about how to configure apt package sources,
# see the sources.list(5) manual.

เขียน shutdown service ใน ubuntu

ใน ubuntu จะมีโปรแกรมชื่อ systemd  เป็น service manager

ไฟล์ abc.service ต่างๆ จะอยู่ใน  /etc/systemd/system เพื่อให้ service นั้นๆ run ตอนที่คอมเปิดเครื่อง/รีสตาร์ท

ไฟล์ .service ที่เราเขียนเอง จะถูกเก็บไว้เป็น symbolic link ของpathจริง ใน /etc/systemd/system

[Unit]
Description=remote shutdown service

[Service]
ExecStart=/bin/bash -c "python -m uvicorn shutdown_api:app --host 0.0.0.0 --port 7999 --reload"
Restart=always
Type=simple
WorkingDirectory=/mnt/shutdown_api/
RestartSec=10
StandardOutput=syslog
StandardError=syslog

[Install]
WantedBy=multi-user.target

จริงๆแล้ว ใช้ ExecStart=/bin/bash -c “python3.8 /mnt/shutdown_api/shutdown_api.py” ก็น่าจะได้ แต่เซิฟเวอร์ที่ใช้อยู่เป็นอะไรไม่รู้รันคำสั่งธรรมดาไม่ได้ เลยต้องพิมพ์แบบยาวๆ

import uvicorn
from fastapi import FastAPI
import subprocess

app = FastAPI()

@app.get("/")
def shutdown():
    #subprocess.run([f"shutdown -h now"], shell=True)
    password = "serverpassword"
    command = f"echo {password} | sudo -S shutdown -h now"
    print(command)
    subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)    

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=7999, reload=True)

ไฟล์ python นี้คือ ให้ uvicorn server รัน FastAPI application (app)

ส่วน app = FastAPI() ก็จะเรียก def shutdown() ถ้ามี HTTP GET command ถูกเรียกใข้งาน

จากการที่เรา พิมพ์ curl http://192.168.11.122:7999   ใน terminal

ปล.  host=”0.0.0.0″ means that the server will listen on all available network interfaces on the host machine.  This makes the server accessible from any IP address on the network.

วิธีติดตั้ง service

1. sudo systemctl daemon-reload
#to reload the systemd manager configuration

2. sudo systemctl enable shutdown.service
#to enable the service to start at boot (create symbolic link if not exist)

3. sudo systemctl start shutdown.service
#to start the service

4. sudo systemctl status shutdown.service
#to check the status of the service

ถ้า  host=0.0.0.0 ตามที่เขียนไว้ใน python file คือ ok

แต่ถ้าเป็น host=127.0.0.1 คือเป็น loopback จะไม่สามารถเรียก http get จาก คอมเครื่องอื่นในเน็ตเวิคได้

5. netstat -an|more #to check all available services

ปล. เขียนแยกหลายๆ decorator ก็เหมือนจะได้นะ

@app.get(“/shutdown”)
async def shutdown():

@app.get(“/restart”)
async def restart():

ส่วน HTTP POST ดูใช้งานยากอยู่ ยังไม่เคยลอง แต่ประมาณนี้
@app.post(“/items/”)
async def create_item(item: Item):

curl --header "Content-Type: application/json" \
     --request POST \
     --data '{"name": "example item", "price": 9.99}' \
     http://localhost:8000/items/

ตรง –data คือ ส่ง json structure เข้าไปเป็น input ที่ฟังก์ชัน