{"id":17118215,"url":"https://github.com/lgfae/labsysopt1","last_synced_at":"2025-03-24T01:44:21.230Z","repository":{"id":217321711,"uuid":"621067930","full_name":"LGFae/LabSysOpT1","owner":"LGFae","description":null,"archived":false,"fork":false,"pushed_at":"2023-04-12T21:26:38.000Z","size":97,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-01-29T08:11:54.012Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/LGFae.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2023-03-29T23:38:35.000Z","updated_at":"2023-04-12T21:08:33.000Z","dependencies_parsed_at":"2024-01-15T19:04:58.233Z","dependency_job_id":"8ee79368-bb43-453b-836e-be0212564d53","html_url":"https://github.com/LGFae/LabSysOpT1","commit_stats":null,"previous_names":["lgfae/labsysopt1"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LGFae%2FLabSysOpT1","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LGFae%2FLabSysOpT1/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LGFae%2FLabSysOpT1/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LGFae%2FLabSysOpT1/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/LGFae","download_url":"https://codeload.github.com/LGFae/LabSysOpT1/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245195908,"owners_count":20575936,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-14T17:53:48.295Z","updated_at":"2025-03-24T01:44:21.212Z","avatar_url":"https://github.com/LGFae.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"Alunos:\n  * Leonardo Gibrowski Faé (20280524-8)\n  * Ricardo Guimarães (20280681-6)\n\nRepositório: https://github.com/Horus645/LabSysOpT1\n\n# Tutorial para reprodução do trabalho\n\nEssas instruções pressupõem que o usuário já efetuou os passos descritos nos tutoriais 1.1, 1.2 e 1.3, disponibilizados pelo professor. Em particular, o usuário deverá\ncriar uma rota entre a máquina Host e a máquina Guest(QEMU)(testar com o Ping).\n\n## Instalando o Interpretador do Python:\n\nAbrindo o menuconfig, defina a seguinte configuração:\n```\n  -- Target Packeges\n    -- Interpreter languages and scripting\n      [*] python3 \n```\n\n* O python exige suporte para o WCHAR. Para disponibilizar o mesmo, voce derá mudar a biblioteca do C disponível na distribuição:\n```\n  -- Toolchain\n    C library (uClibc-ng) --\u003e\n    .\n    .\n    .\n    [*] Enable WCHAR support\n```\n\n* Salve as configurações e execute o comando `make` no terminal\n\n## Disponibilizando o servidor SSH no Guest:\n\n* Novamente, abrindo o menuconfig, habilite o `dropbear`\n\n```\n  -- Target packages\n    -- Networking applications\n      [*] dropbear\n```\n\n* Rode o `make`\n* Suba a máquina emulada e configure uma senha com o comando `passwd`(pode ser vazia)\n* Abra um novo terminal na máquina Host e tente conectar via SSH na Guest com o comando:\n ```ssh root@\u003cIP da Guest\u003e```\n * Para descobrir o IP da máquina Guest, execute o comando `ifconfig` dentro dela(IPv4 da interface eth0)\n * Para sair da sessão SSH, utilize Ctrl+d.\n \n## Rodando o servidor HTTP\n\nPrimeiramente, edite a variável `HOST_NAME` dentro do arquivo web_server.py para o número de IP da máquina target.\n\n### Importando o servidor HTTP para a máquina Guest via SSH:\n \n* Execute o utilitário `scp` da máquina Host para transferir o arquivo contendo o código gerador do servidor HTTP(no caso, web_server.py):\n\n``` scp web_server.py root@\u003cIP Do Host\u003e:/root/ ```\n\n* OBS: Caso o comando falhe(é possível que aconteça por incompatibilidade de versão), adicione a flag -O para utilizar o protocolo legado.\n\n### Executando o servidor\n\nEntre na máquina target e execute o script:\n\n```\npython web_server.py\n```\n\n### Visualizando a página HTML\n\nA página estará disponível no endereço `\u003cIP do Target\u003e:8000`. Você pode acessá-la usando um browser qualquer.\n`screenshot.png` tem um exemplo de como a página será apresentada.\n\n### Como o servidor coleta as informações da página HTML\n\nTirando a data e hora, todas as informações da página são geradas lendo as informações do pseudo sistema de arquivos `/proc`.\nData e hora são adquiridas com o comando `date`:\n\n```python\ndef date_time():\n\treturn os.popen(\"date\").read()\n```\n\nUptime foi calculado a partir de `/proc/uptime`:\n\n```python\ndef uptime():\n    s = read_file(\"/proc/uptime\")\n    total_seconds = float(s.split(' ')[0])\n    return time_from_seconds(total_seconds)\n```\n\nAs informações de cpu foram retiradas de `/proc/cpuinfo`:\n\n```python\ndef procinfo():\n    lines = read_file(\"/proc/cpuinfo\").split('\\n')\n    ret = \"\u003cbr\u003e\"\n    for line in lines:\n        words = line.split(':')\n        key = words[0].strip()\n        value = words[1].strip()\n        if key == \"vendor_id\" or  \\\n           key == \"cpu family\" or \\\n           key == \"model\" or      \\\n           key == \"model name\":\n            ret += HTML_INDENT + key + \": \" + value + \"\u003cbr\u003e\"\n        elif key == \"cpu MHz\":\n            ret += HTML_INDENT + key + \": \" + value + \"\u003cbr\u003e\"\n            break\n    return ret\n```\n\nDados de memória foram lidos de `/proc/meminfo`, e os cálculos de uso são os mesmos que os que estão documentados em `man free`.\n\n```python\ndef mem():\n    \"For this function, we follow the same calculations as the `free` command\"\n    lines = read_file(\"/proc/meminfo\").split('\\n')\n    # MemTotal\n    for s in lines[0].split(' '):\n        if s.isnumeric():\n            total = int(s)\n            break\n    # MemFree\n    for s in lines[1].split(' '):\n        if s.isnumeric():\n            free = int(s)\n            break\n    # Buffers\n    for s in lines[3].split(' '):\n        if s.isnumeric():\n            buffers = int(s)\n            break\n    # Cached\n    for s in lines[4].split(' '):\n        if s.isnumeric():\n            cache = int(s)\n            break\n    # SReclaimable\n    for s in lines[27].split(' '):\n        if s.isnumeric():\n            cache += int(s)\n            break\n\n    used = total - free - buffers - cache\n    return \"Total: \" + str(total) + \"Kb, Used: \" + str(used) + \"Kb\"\n```\n\nA versão do sistema foi colhida de `/proc/version`:\n\n```python\ndef sysversion():\n    return read_file(\"/proc/version\")\n```\n\nOs `PID`s e os nomes dos processos sendo executados na máquina correspondem aos diretórios numerados localizados em `/proc`. Dentro de cada um desses diretórios, há um arquivo `stat`, cuja primeira palavra é o `PID` e a segunda é o comando, entre parênteses:\n\n```python\ndef proc_list():\n    ret = \"\u003cbr\u003e\" + HTML_INDENT + \"Pid Name\u003cbr\u003e\"\n    for dir_entry in os.listdir(\"/proc\"):\n        if dir_entry.isnumeric():\n            s = read_file(\"/proc/\" + dir_entry + \"/stat\")\n            pid = s.split(' ')[0]\n            name = s.split(' ')[1].strip(\"()\")\n            ret += HTML_INDENT + pid + \" \" + name + \"\u003cbr\u003e\"\n    return ret\n```\n\nO uso de cpu é mensurado através dos dados em `/proc/stat`. A documentação encontrada em `man proc` explica que os valores em `/proc/stat` correspondem ao tempo que o cpu permaneceu em cada um de seus estados (includindo `idle`). Usando essas informações, podemos calcular o percentual de tempo em que a cpu ficou ocupada. `/proc/stat` contém informações cumulativas desde que o sistema foi inicializado. Isso significa que para calcularmos os valores atuais, precisamos medir em um determinado instante, aguardar, medir novamente, e pegar a diferença entre os valores. No script, nós medimos a primeira vez durante a inicialização, e medimos novamente cada vez que é feita uma requisição da página para o servidor.\n\n```python\ndef updt_proc_usage() -\u003e float:\n    global prev_idle\n    global prev_non_idle\n    cpustats = read_file(\"/proc/stat\").split('\\n')[0].split(' ')[2:]\n    idle = int(cpustats[3]) + int(cpustats[4])  # idle + iowait\n    non_idle = int(cpustats[0]) + \\\n        int(cpustats[1]) +        \\\n        int(cpustats[2]) +        \\\n        int(cpustats[5]) +        \\\n        int(cpustats[6]) +        \\\n        int(cpustats[7])\n\n    prev_total = prev_idle + prev_non_idle\n    total = idle + non_idle\n\n    totald = total - prev_total\n    idled = idle - prev_idle\n\n    cpu_percentage = float(totald - idled) / float(totald)\n\n    prev_idle = idle\n    prev_non_idle = non_idle\n\n    return cpu_percentage * 100.0\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flgfae%2Flabsysopt1","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flgfae%2Flabsysopt1","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flgfae%2Flabsysopt1/lists"}